const eslint = require("@eslint/js")
const stylistic = require("@stylistic/eslint-plugin-js")
const pluginImport = require("eslint-plugin-import")
const jsdoc = require("eslint-plugin-jsdoc")
const pluginRequireSort = require("eslint-plugin-require-sort")
const globals = require("globals")

module.exports = [
  eslint.configs.recommended,
  {
    languageOptions: {
      ecmaVersion: 2024,
      globals: {

        $: "readonly",
        Api: false,
        Asc: false,
        DocsAPI: false,
        _: "readonly",
        docEditor: false,
        fuzzy: "readonly",
        jQuery: "readonly",
        luxon: "readonly",
        moment: "readonly",
        odoo: "readonly",
        openerp: "readonly",
        owl: "readonly",
        ...globals.browser,
        ...globals.node,
        ...globals.es6,
        ...globals.commonjs,
      },
      parserOptions: { SourceType: "commonjs" },
    },
    plugins: {
      "@stylistic": stylistic,
      import: pluginImport,
      jsdoc,
      "require-sort": pluginRequireSort,
    },
    rules: {
      "@stylistic/array-bracket-newline": [
        "warn",
        "consistent",
      ],
      "@stylistic/array-bracket-spacing": [
        "warn",
        "never",
      ],
      "@stylistic/array-element-newline": [
        "warn",
        "consistent",
      ],
      "@stylistic/arrow-spacing": "warn",
      "@stylistic/block-spacing": "warn",
      "@stylistic/brace-style": [
        "warn",
        "1tbs",
      ],
      "@stylistic/comma-dangle": [
        "warn",
        "always-multiline",
      ],
      "@stylistic/comma-spacing": [
        "warn",
        {
          "after": true,
          "before": false,
        },
      ],
      "@stylistic/comma-style": [
        "warn",
        "last",
      ],
      "@stylistic/eol-last": [
        "warn",
        "always",
      ],
      "@stylistic/function-call-argument-newline": [
        "warn",
        "consistent",
      ],
      "@stylistic/function-call-spacing": [
        "warn",
        "never",
      ],
      "@stylistic/function-paren-newline": [
        "warn",
        "multiline-arguments",
      ],
      "@stylistic/implicit-arrow-linebreak": [
        "warn",
        "beside",
      ],
      "@stylistic/indent": [
        "warn",
        2,
        {
          "ArrayExpression": "first",
          "CallExpression": { "arguments": "first" },
          "FunctionDeclaration": { "parameters": "first" },
          "FunctionExpression": { "parameters": "first" },
          "ImportDeclaration": "first",
          "ObjectExpression": "first",
          "SwitchCase": 1,
          "VariableDeclarator": "first",
          "flatTernaryExpressions": true,
        },
      ],
      "@stylistic/key-spacing": [
        "warn",
        {
          "beforeColon": false,
          "mode": "strict",
        },
      ],
      "@stylistic/keyword-spacing": [
        "warn",
        { "before": true },
      ],
      "@stylistic/lines-between-class-members": [
        "warn",
        "always",
      ],
      "@stylistic/max-len": [
        "warn",
        {
          "code": 120,
          "ignoreComments": true,
          "ignoreUrls": true,
        },
      ],
      "@stylistic/multiline-ternary": [
        "warn",
        "never",
      ],
      "@stylistic/new-parens": "warn",
      "@stylistic/no-extra-semi": "warn",
      "@stylistic/no-mixed-spaces-and-tabs": "warn",
      "@stylistic/no-multi-spaces": "warn",
      "@stylistic/no-multiple-empty-lines": [
        "warn",
        { "max": 1 },
      ],
      "@stylistic/no-tabs": "warn",
      "@stylistic/no-trailing-spaces": "warn",
      "@stylistic/no-whitespace-before-property": "warn",
      "@stylistic/nonblock-statement-body-position": [
        "warn",
        "beside",
      ],
      "@stylistic/object-curly-newline": [
        "error",
        {
          "ExportDeclaration": {
            "minProperties": 3,
            "multiline": true,
          },
          "ImportDeclaration": "never",
          "ObjectExpression": {
            "consistent": false,
            "minProperties": 2,
            "multiline": true,
          },
          "ObjectPattern": {
            "consistent": true,
            "multiline": true,
          },
        },
      ],
      "@stylistic/object-curly-spacing": [
        "warn",
        "always",
      ],
      "@stylistic/object-property-newline": [
        "warn",
        { "allowAllPropertiesOnSameLine": true },
      ],
      "@stylistic/padded-blocks": [
        "warn",
        "never",
      ],
      "@stylistic/quotes": [
        "warn",
        "double",
      ],
      "@stylistic/semi": [
        "warn",
        "never",
      ],
      "@stylistic/semi-spacing": "warn",
      "@stylistic/space-before-blocks": "warn",
      "@stylistic/space-before-function-paren": [
        "warn",
        {
          "anonymous": "always",
          "asyncArrow": "always",
          "named": "never",
        },
      ],
      "@stylistic/space-in-parens": [
        "warn",
        "never",
      ],
      "@stylistic/space-infix-ops": ["warn"],
      "accessor-pairs": "warn",
      "array-callback-return": "warn",
      "arrow-parens": "warn",
      "callback-return": "warn",
      "capitalized-comments": [
        "warn",
        "always",
        {
          ignoreConsecutiveComments: true,
          ignoreInlineComments: true,
        },
      ],
      complexity: [
        "warn",
        20,
      ],
      "constructor-super": "warn",
      "curly": "warn",

      "dot-notation": "warn",
      "eqeqeq": [
        "warn",
        "always",
      ],
      "global-require": "warn",
      "handle-callback-err": "warn",
      "id-blacklist": "warn",
      "id-match": "warn",
      "import/first": "warn",
      "import/newline-after-import": "warn",
      "import/order": [
        "warn",
        {
          "alphabetize": {
            "caseInsensitive": true,
            "order": "asc",
          },
          "groups": [
            "builtin",
            "external",
            [
              "parent",
              "sibling",
              "index",
            ],
          ],
        },
      ],
      "init-declarations": "error",
      "jsdoc/check-alignment": "warn",
      "jsdoc/check-line-alignment": "warn",
      "jsdoc/check-tag-names": [
        "warn",
        { "definedTags": ["odoo-module"] },
      ],
      "jsdoc/check-types": "warn",
      "jsdoc/multiline-blocks": "warn",
      "jsdoc/require-param-description": "off",
      "jsdoc/require-return": "off",
      "jsdoc/require-return-description": "off",
      "jsdoc/require-return-type": "off",
      "jsdoc/require-returns": "warn",
      "max-depth": "warn",
      "max-nested-callbacks": "warn",
      "max-statements-per-line": "warn",
      "no-alert": "warn",
      "no-array-constructor": "warn",
      "no-caller": "warn",
      "no-case-declarations": "warn",
      "no-class-assign": "warn",
      "no-cond-assign": "error",
      "no-const-assign": "error",
      "no-constant-condition": "warn",
      "no-control-regex": "warn",
      "no-debugger": "error",
      "no-delete-var": "warn",
      "no-div-regex": "warn",
      "no-dupe-args": "error",
      "no-dupe-class-members": "error",
      "no-dupe-keys": "error",
      "no-duplicate-case": "error",
      "no-duplicate-imports": "error",
      "no-else-return": "warn",
      "no-empty": "warn",
      "no-empty-character-class": "warn",
      "no-empty-function": "error",
      "no-empty-pattern": "error",
      "no-eq-null": "error",
      "no-eval": "error",
      "no-ex-assign": "error",
      "no-extend-native": "warn",
      "no-extra-bind": "warn",
      "no-extra-boolean-cast": "warn",
      "no-extra-label": "warn",
      "no-fallthrough": "warn",
      "no-func-assign": "error",
      "no-global-assign": "error",
      "no-implicit-coercion": [
        "warn",
        { allow: ["~"] },
      ],
      "no-implicit-globals": "warn",
      "no-implied-eval": "warn",
      "no-inline-comments": "warn",
      "no-inner-declarations": "warn",
      "no-invalid-regexp": "warn",
      "no-irregular-whitespace": "warn",
      "no-iterator": "warn",
      "no-label-var": "warn",
      "no-labels": "warn",
      "no-lone-blocks": "warn",
      "no-lonely-if": "error",
      "no-mixed-requires": "error",
      "no-multi-str": "warn",
      "no-native-reassign": "error",
      "no-negated-condition": "warn",
      "no-negated-in-lhs": "error",
      "no-new": "warn",
      "no-new-func": "warn",
      "no-new-object": "warn",
      "no-new-require": "warn",
      "no-new-symbol": "warn",
      "no-new-wrappers": "warn",
      "no-obj-calls": "warn",
      "no-octal": "warn",
      "no-octal-escape": "warn",
      "no-param-reassign": "warn",
      "no-path-concat": "warn",
      "no-plusplus": "warn",
      "no-process-env": "warn",
      "no-process-exit": "warn",
      "no-proto": "warn",
      "no-prototype-builtins": "warn",
      "no-redeclare": "warn",
      "no-regex-spaces": "warn",
      "no-restricted-globals": "warn",
      "no-restricted-imports": "warn",
      "no-restricted-modules": "warn",
      "no-restricted-syntax": "warn",
      "no-return-assign": "error",
      "no-script-url": "warn",
      "no-self-assign": "warn",
      "no-self-compare": "warn",
      "no-sequences": "warn",
      "no-shadow": "warn",
      "no-shadow-restricted-names": "warn",
      "no-sparse-arrays": "warn",
      "no-sync": "warn",
      "no-this-before-super": "warn",
      "no-throw-literal": "warn",
      "no-undef": "error",
      "no-undef-init": "warn",
      "no-unmodified-loop-condition": "warn",
      "no-unneeded-ternary": "error",
      "no-unreachable": "error",
      "no-unsafe-finally": "error",
      "no-unused-expressions": "error",
      "no-unused-labels": "error",
      "no-unused-vars": [
        "warn",
        { "vars": "local" },
      ],
      "no-use-before-define": "error",
      "no-useless-call": "warn",
      "no-useless-computed-key": "warn",
      "no-useless-concat": "warn",
      "no-useless-constructor": "warn",
      "no-useless-escape": "warn",
      "no-useless-rename": "warn",
      "no-void": "warn",
      "no-with": "warn",
      "operator-assignment": [
        "error",
        "always",
      ],
      "prefer-const": "warn",
      radix: "warn",
      "require-sort/require-sort": [
        "warn",
        {
          "ignoreCase": true,
          "ignoreDeclarationSort": true,
        },
      ],
      "require-yield": "warn",
      // "sort-imports": "warn",
      "sort-keys": "warn",
      "spaced-comment": [
        "error",
        "always",
      ],
      strict: [
        "error",
        "function",
      ],
      "use-isnan": "error",
      "valid-typeof": "warn",
      yoda: "warn",
    },
    settings: {
      jsdoc: {
        preferredTypes: {
          array: "Array",
          bool: "Boolean",
          boolean: "Boolean",
          number: "Number",
          object: "Object",
          str: "String",
          string: "String",
        },
        tagNamePreference: {
          arg: "param",
          argument: "param",
          augments: "extends",
          constructor: "class",
          exception: "throws",
          func: "function",
          method: "function",
          prop: "property",
          return: "returns",
          virtual: "abstract",
          yield: "yields",
        },
      },
    },
  },
  {
    files: ["**/*.esm.js"],
    languageOptions: {
      ecmaVersion: 2024,
      sourceType: "module",
    },
  },
]
